// 编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐

package main

import (
	"fmt"
	"strconv"
	"strings"
)

// 方式一: 通过占位符控制宽度
func f1_placeholder(n uint64) {
	strN := strconv.FormatUint(n, 10)
	width := len(strN)
	dataFmtStr := fmt.Sprintf("%%-%dd", width+1)
	spaceFmtStr := fmt.Sprintf("%%-%ds", width+1)

	for i := uint64(1); i <= n; i++ {
		// 打印空白符
		for j := n - i; j > 0; j-- {
			fmt.Printf(spaceFmtStr, "")
		}

		// 打印数据
		for j := i; j > 0; j-- {
			fmt.Printf(dataFmtStr, j)
		}

		// 换行
		fmt.Println()
	}
}

// 方式二: 计算数字宽度，输出相应数量的空格
func f2_space(n uint64) {
	for i := uint64(1); i <= n; i++ {
		// 打印空白符 (数字加空格的宽度)
		for j := n; j > i; j-- {
			width := len(strconv.FormatUint(j, 10)) + 1 // 数字加空格的宽度
			fmt.Print(strings.Repeat(" ", width))
		}

		// 打印数据
		for j := i; j > 1; j-- {
			fmt.Printf("%d ", j)
		}
		fmt.Printf("%d\n", 1) // 最后一列结尾没空格
	}
}

func main() {
	f1_placeholder(12)
	f2_space(12)
}

/*
                                 1
                              2  1
                           3  2  1
                        4  3  2  1
                     5  4  3  2  1
                  6  5  4  3  2  1
               7  6  5  4  3  2  1
            8  7  6  5  4  3  2  1
         9  8  7  6  5  4  3  2  1
      10 9  8  7  6  5  4  3  2  1
   11 10 9  8  7  6  5  4  3  2  1
12 11 10 9  8  7  6  5  4  3  2  1
                         1
                       2 1
                     3 2 1
                   4 3 2 1
                 5 4 3 2 1
               6 5 4 3 2 1
             7 6 5 4 3 2 1
           8 7 6 5 4 3 2 1
         9 8 7 6 5 4 3 2 1
      10 9 8 7 6 5 4 3 2 1
   11 10 9 8 7 6 5 4 3 2 1
12 11 10 9 8 7 6 5 4 3 2 1
*/
